package od.one;

import java.util.Scanner;

/**
 * @author: Shelly
 * @create: 2024-01-30 14:59:13
 * @version: 1.0
 * @describe: 密码输入检测
 * 题目描述：密码输入检测 (本题分值100)
 * 给定用户密码输入流input，输入流中字符'<"表示退格，可以清除前一个输入的字符，请你编写程序，输出最终得到的密码字符，并判断密码是否满足如下的密码安全要求。
 * 密码安全要求如下：
 * 1.密码长度>=8;
 * 2.密码至少需要包含1个大写字母；
 * 3.密码至少需要包含1个小写字母；
 * 4.密码至少需要包含1个数字；
 * 5.密码至少需要包含1个字母和数字以外的非空白特殊字符
 * 注意空串退格后仍然为空串，且用户输入的字符串不包含‘<’字符和空白字符。
 * 输入描述
 * 用一行字符串表示输入的用户数据，输入的字符串中'<'字符标识退格，用户输入的字符串不包含空白字符，例如：ABC<c89%000<
 * 输出描述
 * 输出经过程序处理后，输出的实际密码字符串，并输出改密码字符串是否满足密码安全要求。两者间由'，分隔，例如：ABc89%00，true
 * 示例1
 * 输入
 * 1    ABC<c89%000<
 * 输出
 * 1  ABc89%00, true
 * 说明
 * 解释：多余的C和0由于退格被去除，最终用户输入的密码为ABc89%00，且满足密码安全要求，输出true
 */
public class OD06 {
    public static void main(String[] args) {
        // 创建一个Scanner对象来读取用户的输入
        Scanner scanner = new Scanner(System. in);
        // 读取一行输入
        String input = scanner. nextLine();
// 创建一个StringBuilder对象来构建结果字符串
        StringBuilder result = new StringBuilder();
        // 创建四个布尔变量来检查输入字符串中是否包含大写字母、小写字母、数字和特殊字符
        boolean isBig = false;
        boolean isSmall = false;
        boolean isNum = false;
        boolean isSpec = false;
// 遍历输入字符串中的每一个字符
        for (char c : input. toCharArray()) {
// 如果字符是'<'，则删除结果字符串的最后一个字符
            if (c == '<') {
                if (result.length() > 0) {
                    result.deleteCharAt(result.length() - 1);
                }
            } else {
                // 否则，将字符添加到结果字符串中
                result.append(c);
            }
        }
        // 遍历输入字符串中的每一个字符
        for (int i = 0; i < result. length(); i++) {
            char c = result. charAt(i);
            // 检查字符是否是数字
            if (  Character. isDigit(c)) {
                isNum = true;
            }
            // 检查字符是否是小写字母
            else if (  Character. isLowerCase(c)) {
                isSmall = true;
            }
// 检查字符是否是大写字母
            else if ( Character. isUpperCase(c)) {
                isBig = true;
            }
// 检查字符是否是特殊字符
            else  {
                isSpec = true;
            }
        }
// 检查结果字符串是否满足长度大于等于8，并且包含大写字母、小写字母、数字和特殊字符
        boolean flagRes = result. length() >= 8 && isNum && isSmall && isBig && isSpec;
        // 输出结果字符串和检查结果
        System. out. println(result + "," + flagRes);
    }
}
/*
* 解题思路
1.始化了五个变量: result (一个空字符串用于存储处理后的输入) ,  is big , is small,  is num和is spec  (四个布尔变量, 用于检查处理后的字符串是否包含大写字母、小写字母、数字和特殊字符) 。
2.接下来，代码遍历输入的字符串中的每一个字符。对于每一个字符，代码首先检查它是否是'<'。如果是，那么代码将删除 result 字符串的最后一个字符(如果存在的话) 。否则，代码将执行以下操作：
。将字符添加到result字符串中。
。如果字符是数字, 并且is num当前为False, 那么将 is num设置为True。
。如果字符是小写字母, 并且is small 当前为False, 那么将is small设置为True。
。如果字符是大写字母, 并且is big当前为False, 那么将 is big设置为True。
。如果字符是特殊字符(即, 它不是数字、小写字母、大写字母或空格) , 并且is spec 当前为False, 那么将is spec设置为True。
3.在遍历完输入的字符串后，代码将检查 result 字符串是否满足以下条件：长度大于等于8，并且包含大写字母、小写字母、数字和特殊字符。如果满足这些条件, 那么flag res 将被设置为True, 否则, 它将被设置为False。
4.最后，代码将输出 result 字符串和 flag res的值。这两个值之间用逗号分隔，flag res 的值被转换为字符串格式。
总的来说，这段代码的主要目标是对用户的输入进行处理，并检查处理后的结果是否满足特定的条件。
* */